package com.springboot.util.time;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 * description: 日期工具类
 *
 * @author: zyj
 * @date: 2021/11/30
 */
public class MyDateUtil {

    public static String YYYY_MM_DD = "yyyy-MM-dd";
    public static final String FULL_TIME = "yyyy-MM-dd HH:mm:ss";
    public static String YYYY_MM_DD_F = "yyyy/MM/dd";

    /**
     * 将String字符串转换为java.sql.Timestamp格式日期,用于数据库保存
     *
     * @param strDate    表示日期的字符串
     * @param dateFormat 传入字符串的日期表示格式（如："yyyy-MM-dd HH:mm:ss"）
     * @return java.sql.Timestamp类型日期对象（如果转换失败则返回null）
     */
    public static java.sql.Timestamp strToSqlDate(String strDate, String dateFormat) {
        SimpleDateFormat sf = new SimpleDateFormat(dateFormat);
        Date date = null;
        try {
            date = sf.parse(strDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        java.sql.Timestamp dateSQL = new java.sql.Timestamp(date.getTime());
        return dateSQL;
    }

    /**
     * description: 时间段内的每一天
     *
     * @param dBeginStr
     * @param dEndStr
     * @return: List<Date>
     * @author: zyj
     * @date: 2021/11/30
     */
    public static List<Date> findDatesStr(String dBeginStr, String dEndStr) throws Exception {
        SimpleDateFormat sdf = new SimpleDateFormat(YYYY_MM_DD);
        return findDates(sdf.parse(dBeginStr), sdf.parse(dEndStr));
    }

    /**
     * description: 时间段内的每一天
     *
     * @param dBegin
     * @param dEnd
     * @return: List<Date>
     * @author: zyj
     * @date: 2021/11/30
     */
    public static List<Date> findDates(Date dBegin, Date dEnd) throws Exception {
        List lDate = new ArrayList();
        lDate.add(dBegin);
        Calendar calBegin = Calendar.getInstance();
        // 使用给定的 Date 设置此 Calendar 的时间
        calBegin.setTime(dBegin);
        Calendar calEnd = Calendar.getInstance();
        // 使用给定的 Date 设置此 Calendar 的时间
        calEnd.setTime(dEnd);
        // 测试此日期是否在指定日期之后
        while (dEnd.after(calBegin.getTime())) {
            // 根据日历的规则，为给定的日历字段添加或减去指定的时间量
            calBegin.add(Calendar.DAY_OF_MONTH, 1);
            lDate.add(calBegin.getTime());
        }
        return lDate;
    }


    /**
     * description: date 转string
     *
     * @param date 时间转换
     * @return: String
     * @author: zyj
     * @date: 2021/12/1
     */
    public static String coverSqlDates(java.sql.Date date) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat(YYYY_MM_DD);
        return sdf.format(date);
    }

    public static String coverUtilDatesToDay(Date date) {
        try {
            SimpleDateFormat sdf = new SimpleDateFormat(FULL_TIME);
            return sdf.format(date);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }

    public static String coverUtilDates(Date date) {
        try {
            SimpleDateFormat sdf = new SimpleDateFormat(FULL_TIME);
            return sdf.format(date);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }


    /**
     * description: string 转date
     *
     * @param date 时间转换
     * @return: String
     * @author: zyj
     * @date: 2021/12/1
     */
    public static Date coverDatesStr(String date, String format) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.parse(date);
    }


    /**
     * description: string 转date
     *
     * @param date 时间转换
     * @return: String
     * @author: zyj
     * @date: 2021/12/1
     */
    public static java.sql.Date coverSqlDatesStr(String date) throws ParseException {
        return new java.sql.Date(coverDatesStr(date, YYYY_MM_DD).getTime());
    }

    public static java.sql.Date coverSqlDatesStr(String date, String format) throws ParseException {
        return new java.sql.Date(coverDatesStr(date, format).getTime());
    }

    public static String coverDateToStr(Date date, String format) {
        try {
            SimpleDateFormat sdf = new SimpleDateFormat(format);
            return sdf.format(date);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }

    /**
     * 方法描述 判断字符串日期格式是否正确
     * @since: 1.0
     * @param str
     * @param formatStr
     * @return: boolean
     * @author: zyj
     * @date: 2022/3/7 16:23
     */
    public static boolean isValidDate(String str, String formatStr) {
        boolean convertSuccess = true;
        SimpleDateFormat format = new SimpleDateFormat(formatStr);
        try {
            // 设置lenient为false. 否则SimpleDateFormat会比较宽松地验证日期，比如2007/02/29会被接受，并转换成2007/03/01
            format.setLenient(false);
            format.parse(str);
        } catch (Exception e) {
            // 如果throw java.text.ParseException或者NullPointerException，就说明格式不对
            convertSuccess = false;
        }
        return convertSuccess;
    }
}
